package conservare.dao;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityTransaction;
import javax.persistence.TypedQuery;

import conservare.modelo.contrato.Contrato;
import conservare.modelo.financeiro.ContaAReceber;
import conservare.modelo.type.Mes;

public class ContaAReceberDAO extends Dao{

	private static final long serialVersionUID = -6869092153992984208L;

	public ContaAReceber salvar(ContaAReceber contaAReceber) {
		
		EntityTransaction transaction = getEm().getTransaction();
		
		try{
			transaction.begin();
			if(contaAReceber.getId() == null){
				getEm().persist(contaAReceber);
			}else{
				getEm().merge(contaAReceber);
			}
			transaction.commit();
		}catch(Exception e){
			e.printStackTrace();
		}
		
		return contaAReceber;
	}
	
	public ContaAReceber getById(Integer id) {
		return getPojo(ContaAReceber.class, id);
	}

	public List<ContaAReceber> getTodos() {
		return getList(ContaAReceber.class, "select a from ContaAReceber a order by a.id desc");
	}
	
	public List<ContaAReceber> getContasPendentesDePagamento() {
		return getList(ContaAReceber.class, "select a from ContaAReceber a where a.pagamento is null order by a.dataDeVencimento desc");
	}
	
	public List<ContaAReceber> getContasPagas() {
		return getList(ContaAReceber.class, "select a from ContaAReceber a where a.pagamento is not null order by a.dataDeVencimento desc");
	}
	
	
/*	public List<Contrato> obterContratosParaOsQuaisHouveLancamentoNoAnoMes(Integer anoDeReferencia, Integer mesDeReferencia){
		return getList(Contrato.class, "select contarec.contrato from ContaAReceber contarec where contarec.anoDeReferencia = ?1 and contarec.mesDeReferencia = ?2", anoDeReferencia, mesDeReferencia);
	}*/
	
	public boolean isContratoJaLancado(Contrato contrato, Integer anoRef, Mes mesRef){
		 return ((Long)getPojo(Number.class, "select count(a) from ContaAReceber a where a.anoDeReferencia = ?1 and a.mesDeReferencia = ?2 and a.contrato = ?3",anoRef,mesRef,contrato)) == 0 ? false : true;
	}

	public String getMesesDeLancamentosRecentesDesteContrato(Contrato contrato, int topN) {
		
		String retorno = "";
		
		if(existemLancamentosParaEsteContrato(contrato)){
			String sql ="select a from ContaAReceber a where a.contrato = ?1 order by a.anoDeReferencia desc, a.mesDeReferencia desc";
			List<ContaAReceber> contas =  getLimitedList(ContaAReceber.class, sql, topN ,contrato);
			
			if(contas != null && contas.size() > 0){
				for(ContaAReceber conta : contas){
					retorno += conta.getAnoMesReferenciaFormatado() + " ";
				}
			}
		}
		
		return retorno;
	}
	
	private boolean existemLancamentosParaEsteContrato(Contrato contrato){
		String sql = "select count(a) from ContaAReceber a where a.contrato = ?1"; 
		return ((Long)getPojo(Number.class, sql, contrato)) == 0L ? false : true;
	}
	
}
